<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        
    </style>
</head>
<body>
    
</body>
<script>
    function fn(a, b){
        console.log(a, b);
        console.log(this);
        return "hahah"
    }

    fn("hello","world");

    var obj = {
        name:"obj"
    }

    // call
    // 功能：改变原函数的this指向，并立即执行改变this指向之后的新函数
    // 参数：
        // 参数1：要改变的this的指向值
        // 参数2~：作为实参传入原函数
    // 返回值：原函数的返回值
    // var res1 = fn.call(123, "a", "b");
    // console.log(res1);

    // var res2 = fn.call("hello", "q", "w");
    // console.log(res2)

    // fn.call(obj, "a", "s");


    // apply
    // 功能：改变原函数的this指向，并立即执行改变this指向之后的新函数
    // 参数：
        // 参数1：要改变的this的指向值
        // 参数2：必须是数组的格式，自动将数组解析之后，作为实参传入原函数
    // 返回值：原函数的返回值
    // var res1 = fn.apply(123, ["a", "b", "c"]);
    // console.log(res1);

    // var res2 = fn.apply("hello", ["q", "w", "e"]);
    // console.log(res2)

    // fn.apply(obj, ["hello"]);


    // bind
    // 功能：改变原函数的this指向，将返回改变之后的新函数
    // 参数：
        // 参数1：要改变的this的指向值
        // 参数2~：作为实参传入原函数
    // 返回值：改变this指向之后的新函数
    // var res1 = fn.bind(123, "q", "w");
    // console.log(res1);
    // console.log(res1 === fn);
    // res1()

    // var res2 = fn.bind("hello","a","s");
    // console.log(res2)
    // res2();

    // fn.bind(obj)();

    
    
    // fn();
</script>
</html>